package org.deng.learn.netty.server;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

/**
 * @ Author: DengLibin
 * @ Description: netty服务端
 * @ DateTime:  16:34 2018/5/5 0005
 */
public class Server {
    private static  int port = 8000;

    private static  void startServer(){
        /**
         * /**
         * Netty创建全部都是实现自AbstractBootstrap。
         * 客户端的是Bootstrap，服务端的则是    ServerBootstrap。
         * ServerBootstrap是一个用于设置服务器的助手类
         */
        ServerBootstrap serverBootstrap = new ServerBootstrap();
        /**
         * NioEventLoopGroup是处理I/O操作的多线程事件循环。 Netty为不同类型的传输提供了各种EventLoopGroup实现。
         * 在此示例中，实现的是服务器端应用程序，因此将使用两个NioEventLoopGroup。
         * 第一个通常称为“boss”，接受传入连接。 第二个通常称为“worker”，
         * 当“boss”接受连接并且向“worker”注册接受连接，则“worker”处理所接受连接的流量。
         * 使用多少个线程以及如何将它们映射到创建的通道取决于EventLoopGroup实现，甚至可以通过构造函数进行配置。
         */
        EventLoopGroup bossGroup = new NioEventLoopGroup(1); // 可以指定线程数 默认 cpu核数2倍
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            serverBootstrap.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class) //指定使用NioServerSocketChannel类，该类用于实例化新的通道以接受传入连接
                    .childHandler(new MyServerChannelInitializer())
                    .option(ChannelOption.SO_BACKLOG, 128)//option()用于接受传入连接的NioServerSocketChannel
                    .childOption(ChannelOption.SO_KEEPALIVE, true);//childOption()用于由父ServerChannel接受的通道，在这个示例中为NioServerSocketChannel
            ChannelFuture f = serverBootstrap.bind(port).sync();
            System.out.println("服务端启动成功...");
            // 监听服务器关闭监听
            f.channel().closeFuture().sync();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //关闭EventLoopGroup，释放掉所有资源包括创建的线程
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }

    public static  void main(String[] args){
        startServer();
    }
}
